#ifndef WEBSOCKETSERVER_H
#define WEBSOCKETSERVER_H

#include <QtWebSockets/QWebSocketServer>
#include <QtWebSockets/QWebSocket>
#include <QJsonDocument>
#include <QJsonObject>

#include "entities.h"

class WebSocketServer : public QObject
{
    Q_OBJECT

public:
    explicit WebSocketServer(QObject *parent = nullptr);

    void broadcastMessage(const QString &message);      // 向所有客户端广播消息
    void broadcastJson(const QJsonObject &jsonObj);     // 向所有客户端广播JSON对象
    QWebSocket* findClientByName(const QString& name);  // 添加一个辅助方法来查找指定名称的客户端

public slots:
    void sendMessageToClient(QWebSocket *client, const QString &message);               // 向指定客户端发送文本消息
    void sendJsonToClient(QWebSocket *client, const QJsonObject &jsonObj);              // 向指定客户端发送JSON对象
    void sendMessageToClientByAddress(const QString &address, const QString &message);  // 通过客户端地址查找并发送消息

    void leftWin(const bool& has_avatar, const int& index, const QString& name, const QString& headImgUrl, const QString& content, const QString& id);
    void rightWin(const bool& has_avatar, const int& index, const QString& name, const QString& headImgUrl, const QString& content, const QString& id);

    void leftGiftWin(const bool& has_avatar, const int& index, const QString& name, const QString& headImgUrl, const QString& content, const QString& id);
    void rightGiftWin(const bool& has_avatar, const int& index, const QString& name, const QString& headImgUrl, const QString& content, const QString& id);

    void additem(const QString& player_id, const QString& player_name, const QString& player_HeadImgUrl, const QString& team, const QString& content, const int& progress, const QString& prefix);
    void delitem(const QString& player_id, const QString& player_name);

    void onClearUI(); // 向客户端发送清空UI通知
    void onClearPopover();
    void showRanking();

    QString getClientNameByIP(const QString &ip) const;                 // 根据IP获取客户端名称
    void changePlayerSort(const QString& userId, const int& sortValue); // 改变游戏 UI 玩家顺序
    void showLeaderboard_cs(const QJsonObject& message);                // 给Leaderboard_CS发送【显示排行榜】
    void printConnectedClients() const;                                 // 获取所有在线客户端信息

    void killBroadcast(const Player killer, const Player victim, const int killVoice); // 击杀播报
    void clearKillBroadcast();

private slots:
    void onNewConnection();
    void processTextMessage(const QString &message);
    void socketDisconnected();

private:
    QWebSocketServer *m_server;
    QList<QWebSocket *> m_clients;             // 存储客户端信息的映射
    QMap<QWebSocket*, QString> m_clientNames;  // 客户端名字
    QMap<QString, QWebSocket*> m_clientIPs;    // IP地址到客户端的映射
};

#endif // WEBSOCKETSERVER_H
